﻿using System;
using System.Data;
using System.Data.Common;
using System.Data.Odbc;

namespace Flagwind.Data.Providers
{
	/// <summary>
	/// Odbc 数据访问提供程序类。
	/// </summary>
	public sealed class Odbc : DataProviderBase
	{
		#region 公共属性

		/// <summary>
		/// 当前数据库的类型枚举。
		/// </summary>
		public override DataProviderType ProviderType
		{
			get
			{
				return DataProviderType.UNKNOWN;
			}
		}

		/// <summary>
		/// 获取连接字符串构造类。
		/// </summary>
		public override DbConnectionStringBuilder ConnectionStringBuilder
		{
			get
			{
				return new OdbcConnectionStringBuilder(this.ConnectionString);
			}
		}

		/// <summary>
		/// 获取连接数据库用户的Id。
		/// </summary>
		public override string ConnectionUserId
		{
			get
			{
				if(this.ConnectionStringBuilder.ContainsKey("User ID"))
				{
					return this.ConnectionStringBuilder["User ID"].ToString();
				}
				else
				{
					return "";
				}
			}
		}

		#endregion

		#region 获取方法

		/// <summary>
		/// 获取一个新参数对象。
		/// </summary>
		/// <returns>特定于数据源的参数对象。</returns>
		public override IDataParameter GetParameter()
		{
			return new OdbcParameter();
		}

		/// <summary>
		/// 获取一个新参数对象。
		/// </summary>
		/// <param name="name">参数名字。</param>
		/// <param name="type">数据库数据类型。</param>
		/// <param name="size">字段大小。</param>
		/// <returns>SQL Server 参数对象。</returns>
		public override IDataParameter GetParameter(string name, DbType type, int size)
		{
			var parameter = new OdbcParameter();
			parameter.ParameterName = name;
			parameter.DbType = type;
			parameter.Size = size;
			return parameter;
		}

		/// <summary>
		/// 返回此 SqlConnection 的数据源的架构信息。
		/// </summary>
		/// <param name="collectionName">集合名称，可以为空</param>
		/// <param name="restrictionValues">请求的架构的一组限制值，可以为空</param>
		/// <returns>数据库架构信息表</returns>
		public override DataTable GetSchema(string collectionName, string[] restrictionValues)
		{
			using(var connection = (OdbcConnection)this.GetConnection())
			{
				connection.Open();
				if(restrictionValues == null && string.IsNullOrEmpty(collectionName))
				{
					return connection.GetSchema();
				}
				else if(restrictionValues == null && !string.IsNullOrEmpty(collectionName))
				{
					return connection.GetSchema(collectionName);
				}
				else
				{
					return connection.GetSchema(collectionName, restrictionValues);
				}
			}
		}

		/// <summary>
		/// 获取数据库连接对象实例。
		/// </summary>
		/// <param name="connectionString">连接字符串。</param>
		/// <returns>数据库连接对象</returns>
		public override IDbConnection GetConnection(string connectionString)
		{
			this.ConnectionString = connectionString;
			return new OdbcConnection(connectionString);
		}

		/// <summary>
		/// 获取数据适配器实例。
		/// </summary>
		/// <returns>数据适配器。</returns>
		public override IDbDataAdapter GetDataAdapter(IDbCommand command)
		{
			return new OdbcDataAdapter((OdbcCommand)command);
		}

		/// <summary>
		/// 获取当前数据库类型的参数数据类型名称。
		/// </summary>
		/// <param name="parameter"></param>
		/// <returns></returns>
		public override string GetNativeDbTypeName(IDataParameter parameter)
		{
			return parameter.DbType.ToString();
		}

		#endregion
	}
}